//==================================================================
/// image.h
///
/// Created by Davide Pasca - 2009/10/5
/// See the file "license.txt" that comes with this project for
/// copyright info. 
//==================================================================

#ifndef IMAGE_H
#define IMAGE_H

//==================================================================
//==================================================================
class image
{
public:
	U32			mW, mH;

//private:
	U32			mDepth;

	U32			mBytesPerPixel;
	U32			mBytesPerRow;

private:
	DVec<U8>	mPixels;

public:
	//==================================================================
	image();

	image( const image &from );

	//==================================================================
	image( U32 w, U32 h, U32 depth, U32 rowPitch=0 );

	//==================================================================
	image( const DVec<U8> &pixels, U32 w, U32 h );

	//==================================================================
	image( const DStr &fname, U32 forcedDepth=0 );

		  int *GetPInt()		{ return (		int *)&mPixels[0]; }
	const int *GetPInt() const	{ return (const int *)&mPixels[0]; }

		  U8  *GetPU8()			{ return &mPixels[0]; }
	const U8  *GetPU8() const	{ return &mPixels[0]; }

		  U8  *GetPixelPtr( U32 x, U32 y )
		  {
			  DASSERT( x < mW && y < mH );
			  return &mPixels[ y * mBytesPerRow + x * mBytesPerPixel ];
		  }

	const U8  *GetPixelPtr( U32 x, U32 y ) const
		  {
			  DASSERT( x < mW && y < mH );
			  return &mPixels[ y * mBytesPerRow + x * mBytesPerPixel ];
		  }

		  void SetPixelPtr( U32 x, U32 y, const U8 *pData )
		  {
			  DASSERT( x < mW && y < mH );

			  U8 *pDes = &mPixels[ y * mBytesPerRow + x * mBytesPerPixel ];

			  for (U32 i=0; i < mBytesPerPixel; ++i)
				  pDes[i] = pData[i];
		  }

	void ConvertToDepth( U32 forcedDepth );
};

#endif
